package JDBC;

import utils.JDBCUtils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

/*
*  通过JDBc来控制事务
**/
public class jdbcDemo06 {
    public static void main(String[] args) {
        Connection conn = null;
        PreparedStatement ptmt1 = null;
        PreparedStatement ptmt2 = null;
        try {
            //  获取连接
           conn = JDBCUtils.ConnectionUtils();
             //开启事务
            conn.setAutoCommit(false); //设置为false就是开启了事务
           //定义sql
            // 张三 - 500
            String sql1 = "update account set balance = balance- ? where id = ?";  // 这里讲数字都设置为"?"是用到了prepareStatement.是有利于以后对数字的改变
           //  李四 + 500
            String sql2 = "update account set balance = balance + ? where id =?";
            //获取执行sql对象方法prepareStatement
             ptmt1 = conn.prepareStatement(sql1);
             ptmt2 = conn.prepareStatement(sql2);
             //设置参数
              ptmt1.setDouble(1,500);
              ptmt1.setInt(2,1);
              ptmt2.setDouble(1,500);
              ptmt2.setInt(2,2);
              //执行sql
            ptmt1.executeUpdate();
            ptmt2.executeUpdate();
              //最后提交事务
              conn.commit();

        } catch (Exception throwables) {
            // 因为上面的代码只要出现了任何异常都会跳入到下面的catch里面,因此需要在catch里面进行事务的回滚
            // 事务的回滚
            try {
                if (conn!=null) {
                    conn.rollback();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
            throwables.printStackTrace();
        }finally {
            JDBCUtils.Close(ptmt1,conn);
            JDBCUtils.Close(ptmt2,null);
        }
    }
}
